#ifndef  __SQLIST_H
#define  __SQLIST_H

#include "main.h"
typedef int sqlelemtype;
#define SqlistMaxSzie 10

typedef struct _SQLIST_{
    sqlelemtype *elem;
    int length;
}sqlist;
Status initSqlist(sqlist *L);//初始化链表，主要是建立地址
Status DestorySqlist(sqlist *L);//销毁链表
Status ClearSqlist(sqlist *L);//清空L中的元素
Status SqListInsert(sqlist *L,int i,sqlelemtype e);//在第i位置上插入元素e
Status SqListDelete(sqlist *L,int i);//删除L中的第i个元素
bool SqIsEmpty(sqlist *L);//检查L是否为空
int SqListLength(sqlist *L);//返回L的长度

int LocateSql(sqlist *L,sqlelemtype e);//查找元素e是否存在，成功返回位置，失败返回0
Status GetSqElem(sqlist *L,int i,sqlelemtype *e);//查找L中第i位置上的元素，并把元素返回给e

//****************************线性表的链式结构实现*********************************
typedef struct LNode {
    sqlelemtype data;
    struct LNode *next;
} LNode, *LinkList;//LinkList和LNode*等价
//处于可读性考虑，LinkList L ---L为单链表的头指针
//               LNode *p ---单链表中的节点


Status InitList(LinkList *L);//初始化L
Status LinkGetElem(LinkList L,int i,sqlelemtype *e);//查找L中的第i个元素，并返回给e
LNode* LinkLocate(LinkList L,sqlelemtype e);//查找链表L中的数据元素e，失败返回-1，成功返回位置（1-n）
Status LinkInsert(LinkList L,int i,LNode* e);//在L的第i个位置上插入e
Status LinkDelete(LinkList L,int i);//删除L中第i个结点


Status LinkIsEmpty(LinkList L);//判断是否为空
Status DestortLink(LinkList *L);//销毁链表
Status LinkClear(LinkList L);//清空L：去掉除了头指针外的所有节点
int Linkcount(LinkList L);//计数L中的元素个数

void LinkCreate_H(LinkList L, int num);//头插法建立链表
void LinkCreate_V(LinkList L, int num);//尾插法建立链表
LinkList* LinkConnect(LinkList *Ta,LinkList *Tb);//合并链表

//双向链表
typedef struct __DouLNode {
    sqlelemtype data;
    struct DouLNode  *prior;
    struct DouLNode  *next;
} DouLNode, *DouLinkList;

void DouLinkListInit(DouLinkList *L);
DouLNode* GetElem_Dul(DouLinkList L,int i);//查找L中的第i个元素，并返回给e
void DouLinkListinsert(DouLinkList *L, int num,sqlelemtype e); //在双向链表L中的第i位置插入e

void CreatDL_H(DouLinkList L, int length);//创建长度为lenth的L

#endif

